#pragma once
#include <iostream>
#include <string>
#include <cstring>
#include <cassert>
#include <functional>
#include <pthread.h>

namespace myThread
{
    typedef std::function<void *(void *)> func_t;
    static void *run_thread(void* args) //用于创建线程时function的类型转换
    {
        Thread *_this = static_cast<Thread*>(args);
        return _this->run();
    }

    class Thread
    {
    public:
        Thread(func_t handle, void *args = nullptr) : _handle(handle), _args(args)
        {
            int n = pthread_create(&_tid, nullptr,run_thread,_args);
            assert(n == 0);
            (void)n;
        }

        void *run() { return _handle(_args); }

        void join()
        {
            int n = pthread_join(_tid,nullptr);
            assert(n == 0);
            (void)n;
        }
        ~Thread()
        {
            --threadNum;
        }

    private:
        pthread_t _tid; // 线程名
        func_t _handle; // 线程的运行程序
        void *_args;    // 线程的参数

        static int threadNum; // 当前线程数
    };
}